/*
实验7-1 汉密尔顿回路
分数 25
作者 陈越
单位 浙江大学

著名的“汉密尔顿（Hamilton）回路问题”是要找一个能遍历图中所有顶点的简单回路（即每个顶点只访问 1 次）。本题就要求你判断任一给定的回路是否汉密尔顿回路。
输入格式：

首先第一行给出两个正整数：无向图中顶点数 n（2<n≤200）和边数 m。随后 m 行，每行给出一条边的两个端点，格式为“顶点1 顶点2”，其中顶点从 1 到 n 编号。再下一行给出一个正整数 k，是待检验的回路的条数。随后 k 行，每行给出一条待检回路，格式为：

nv​ v1​ v2​ ⋯ vn​

其中 nv​ 是回路中的顶点数，vi​ 是路径上的顶点编号。
输出格式：

对每条待检回路，如果是汉密尔顿回路，就在一行中输出 YES，否则输出 NO。
输入样例：

6 10
6 2
3 4
1 5
2 5
3 1
4 1
1 6
6 3
1 2
4 5
6
7 5 1 4 3 6 2 5
6 5 1 4 3 6 2
9 6 2 1 6 3 4 5 2 6
4 1 2 5 1
7 6 1 3 4 5 2 6
7 6 1 2 5 4 3 1

输出样例：

YES
NO
NO
NO
YES
NO
*/

/*
解题思路：
1、首先判断回路的顶点数是否等于 n+1，如果不等于 n+1，那么肯定不是汉密尔顿回路。
2、然后判断回路的第一个顶点和最后一个顶点是否相同，如果不相同，那么肯定不是汉密尔顿回路。
3、接着判断回路中是否有重复的顶点，如果有重复的顶点，那么肯定不是汉密尔顿回路。
4、最后判断回路中是否有不相邻的顶点，如果有不相邻的顶点，那么肯定不是汉密尔顿回路。
*/

#include "../base/MGraph.cpp"

#include <iostream>
#include <vector>

using namespace std;

bool is_hamilton(MGraph<int, int> &graph, vector<int> &path) {
    int n = graph.get_num_vertex();
    if (path.size() != n + 1) {
        return false;
    }
    if (path[0] != path[n]) {
        return false;
    }
    vector<bool> visited(n, false);
    for (int i = 0; i < n; ++i) {
        if (visited[path[i]]) {
            return false;
        }
        if (graph.has_edge(path[i], path[i + 1])) {
            visited[path[i]] = true;
        } else {
            return false;
        }
    }
    return true;
}

int main() {
    int num_v, num_e;
    cin >> num_v >> num_e;
    MGraph<int, int> graph(num_v);
    graph.inputWithoutWeight(num_e);
    int k;
    cin >> k;
    for (int i = 0; i < k; ++i) {
        int nv;
        cin >> nv;
        vector<int> path(nv);
        for (int j = 0; j < nv; ++j) {
            cin >> path[j];
        }
        if (is_hamilton(graph, path)) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }
    return 0;
}